/**
 * StickyScroll
 * written by Rick Harris - @iamrickharris
 *
 * Requires jQuery 1.4+
 *
 * Make elements stick to the top of your page as you scroll
 *
 * See README for details
 *
 */
(function($) {
	$.fn.stickyScroll = function(options) {
		var methods = {
			init: function(options) {
				var settings;
				if (options.mode !== 'auto' && options.mode !== 'manual') {
					if (options.container) {
						options.mode = 'auto';
					}
					if (options.bottomBoundary) {
						options.mode = 'manual';
					}
				}
				settings = $.extend({
					mode: 'auto',
					// 'auto' or 'manual'
					container: $('body'),
					topBoundary: null,
					bottomBoundary: null
				}, options);

				function bottomBoundary() {
					return $(document).height() - settings.container.offset().top - settings.container.attr('offsetHeight');
				}

				function topBoundary() {
					return settings.container.offset().top
				}

				function elHeight(el) {
					return $(el).attr('offsetHeight');
				}
				// make sure user input is a jQuery object
				settings.container = $(settings.container);
				if (!settings.container.length) {
					if (console) {
						console.log('StickyScroll: the element ' + options.container + ' does not exist, we\'re throwing in the towel');
					}
					return;
				}
				// calculate automatic bottomBoundary
				if (settings.mode === 'auto') {
					settings.topBoundary = topBoundary();
					settings.bottomBoundary = bottomBoundary();
				}
				return this.each(function(index) {
					var el = $(this),
						win = $(window),
						id = new Date().getDate() + index,
						height = elHeight(el);
					el.data('sticky-id', id);
					win.bind('scroll.stickyscroll-' + id, function() {
						var top = $(document).scrollTop(),
							bottom = $(document).height() - top;
						//  console.log(height);
						//console.log("top:"+top+",topBoundary:"+settings.topBoundary);
						//console.log("bottom:"+bottom+",bottomBoundary:"+settings.bottomBoundary);
						if (bottom <= settings.bottomBoundary) {
							el.offset({
								top: $(document).height() - settings.bottomBoundary - height
							}).removeClass('sticky-active').removeClass('sticky-inactive').addClass('sticky-stopped');
						} else if (top > settings.topBoundary) {
							el.offset({
								top: $(window).scrollTop()
							}).removeClass('sticky-stopped').removeClass('sticky-inactive').addClass('sticky-active');
						} else if (top < settings.topBoundary) {
							el.css({
								position: '',
								top: '',
								bottom: ''
							}).removeClass('sticky-stopped').removeClass('sticky-active').addClass('sticky-inactive');
						}
					});
					win.bind('resize.stickyscroll-' + id, function() {
						if (settings.mode === 'auto') {
							settings.topBoundary = topBoundary();
							settings.bottomBoundary = bottomBoundary();
						}
						height = elHeight(el);
						$(this).scroll();
					})
					el.addClass('sticky-processed');
					// start it off
					win.scroll();
				});
			},
			reset: function() {
				return this.each(function() {
					var el = $(this),
						id = el.data('sticky-id');
					el.css({
						position: '',
						top: '',
						bottom: ''
					}).removeClass('sticky-stopped').removeClass('sticky-active').removeClass('sticky-inactive').removeClass('sticky-processed');
					$(window).unbind('.stickyscroll-' + id);
				});
			}
		};
		// if options is a valid method, execute it
		if (methods[options]) {
			return methods[options].apply(this, Array.prototype.slice.call(arguments, 1));
		}
		// or, if options is a config object, or no options are passed, init
		else if (typeof options === 'object' || !options) {
			return methods.init.apply(this, arguments);
		} else if (console) {
			console.log('Method' + options + ' does not exist on jQuery.stickyScroll');
		}
	};
})(jQuery);